'use strict'

process.chdir(__dirname);

const titbit = require('titbit');
const fs = require('fs');
const dbcfg = require('./dbconfig.js')
const pg = require('pg')
const wxkey = require('./wxkey.js')
const { httpcli } = require('gohttp')
const token = require('titbit-token')
const tbloader = require("titbit-loader")

try {
    fs.accessSync('./images')
} catch (err) {
    fs.mkdirSync('./images')
}

let psql = new pg.Pool(dbcfg)
let cert_path = '/usr/local/share'

const app = new titbit({
    //开启调试模式，若有错误会输出错误信息
    debug: true,
    globalLog: true,
    cert: `${cert_path}/api.hiehie.top.pem`,
    key: `${cert_path}/api.hiehie.top.key`
})

let tb = new tbloader();
tb.init(app);

app.addService('psql', psql)
app.addService('imagePath', `${__dirname}/images`)

//适用于静态资源，*表示任意路径
// app.get('/static/*', async c =>{ })


let tok = new token({
    //token有效期，单位为秒
    expires: 45,
    //必须是32位字符
    key: '1q2w3e4r5t6y7u8i9o0pazsxdcfvgbhn',
    //必须是16位字符
    iv: '1q2w3e4r5t6y7u8i'
})

app.addService('tok', tok)

app.get('/mp-login/:code', async c => {
    let auth_url = `https://api.weixin.qq.com/sns/jscode2session`
        + `?appid=${wxkey.appid}`
        + `&secret=${wxkey.secret}`
        + `&js_code=${c.param.code}`
        + `&grant_type=authorization_code`

    let ret = await httpcli.get(auth_url)
        .then(res => {
            return res.json()
        })
    c.send(tok.make(ret))
})

// app.get('/decrypt/:token', async c => {
//     c.send(tok.verify(c.param.token))
// })

// app.get('/upload', async c => {
//     //c.reply是响应对象，可写的流，在HTTP/1.1中指向response，在HTTP/2中指向http2stream
//     await c.helper.pipe('./upload.html', c.reply);
// })



//运行在2344端口
app.run(2344);

/*
HTTP消息头  content-type 指定了数据的类型（数据的格式）


Client                             Server
content-type描述的值                根据content-type的值决定如何解析Body数据
和要提交的Body数据格式一致


content-type:
multipart/form-data;boundary=xxx -----------------文件解析
text/*                        ------------文件类型
application/*        -------------------要看具体值，application/json也是文本类型
......          ---------------每种类型如何处理是双方设计好的通信方式
1.;

到web框架这一层面，则如何处理是开发框架设计好的，但通常都要遵循一个原则
允许开发者做自己的处理

在文本框架内：
multipart类型   c.body是object乐行 文件信息解析到c.files中
application/x-www-form-urlencoded 传统的表单类型  c.body是object类型，用于获取提交的表单数据
text/*  c.body  是文本类型  c.body-c.rawBody.toString('utf-8')
其他类型  c.body是buffer类型，就是对c.rawBody的引用



*/